// /*
//  * @Author: szx
//  * @Date: 2022-03-11 17:31:27
//  * @LastEditTime: 2022-03-11 19:27:46
//  * @Description:
//  * @FilePath: \MDN_JS学习\手撸JS源码\_Promise最精简版本.js
//  */

// const PENDING = 'pending';
// const FULFILLED = 'fulfilled';
// const REJECTED = 'rejected';
// function _Promise(executor) {
//     const _this = this;
//     this.status = PENDING; //状态
//     this.result = undefined; //成功结果
//     this.onFulfilled = [];
//     this.onRejected = [];
//     function resolve(value) {
//         if (_this.status === PENDING) {
//             _this.status = FULFILLED;
//             _this.result = value;
//             _this.onFulfilled.forEach((fn) => fn(value));
//         }
//     }
//     function reject(reason) {
//         if (_this.status === PENDING) {
//             _this.status = REJECTED;
//             _this.result = reason;
//             _this.onRejected.forEach((fn) => fn(reason));
//         }
//     }
//     try {
//         executor(resolve, reject);
//     } catch (error) {
//         reject(error);
//     }
// }

// _Promise.prototype.then = function (onFulfilled, onRejected) {
//     const _this = this;
//     // 检查是不是function，如果不是，就给个默认函数
//     if (typeof onFulfilled !== 'function') onFulfilled = (value) => value;
//     if (typeof onRejected !== 'function')
//         onRejected = (reason) => {
//             throw reason;
//         };

//     // 这里不能直接返回Promise2
//     const Promise2 = new _Promise((resolve, reject) => {
//         if (_this.status === FULFILLED) {
//             // 虽然已经成功了，但是也不能直接返回值，要通过异步的方式返回值（原生Promise就是这样的）
//             setTimeout(() => {
//                 try {
//                     // 执行成功的回调函数
//                     let result = onFulfilled(_this.result);
//                     resolve(result);
//                 } catch (error) {
//                     reject(error);
//                 }
//             });
//         } else if (_this.status === REJECTED) {
//             setTimeout(() => {
//                 try {
//                     let result = onRejected(_this.result);
//                     resolve(result);
//                 } catch (error) {
//                     reject(error);
//                 }
//             });
//         } else if (_this.status === PENDING) {
//             /*  pending的情况，比如Promise里面有个异步函数正在处理
//                 这种情况，只能先把成功/失败回调函数压入到resolve/reject里面
//                 等异步函数执行的时候，会调用Resolve或者reject，再执行压入到队列的这些异步函数
//             */
//             _this.onFulfilled.push(() => {
//                 setTimeout(() => {
//                     try {
//                         let result = onFulfilled(_this.result);
//                         resolve(result);
//                     } catch (error) {
//                         reject(error);
//                     }
//                 });
//             });
//             _this.onRejected.push(() => {
//                 setTimeout(() => {
//                     try {
//                         let result = onRejected(_this.result);
//                         resolve(result);
//                     } catch (error) {
//                         reject(error);
//                     }
//                 });
//             });
//         }
//     });
//     return Promise2;
// };

// _Promise.prototype.catch = function (onRejected) {
//     this.then(undefined, onRejected);
// };

// console.log('开始')
// const p = new _Promise((resolve, reject) => {
//     console.log('输入');

//     setTimeout(function () {
//         resolve(1);
//     }, 1000);
// });
// p.then(
//     (value) => {
//         console.log('1', value);
//         return 2;
//     },
//     (reason) => {
//         console.log('err1', err);
//     }
// )
//     .then((value) => {
//         console.log('2', value);
//         throw 'wrong!';
//     })
//     .catch((err) => {
//         console.log('err2', err);
//     });
// console.log('结束');
